'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#作者：cacho_37967865
#博客：https://blog.csdn.net/sinat_37967865
#文件：dealTime.py
#日期：2019-08-30
#备注：通过time和datetime模块对时间进行处理
1. 按日计息-固定期限还款-计算到期还款日（传入放款日期、固定期限天数）
2. 按月计息-每月对日还款-计算还款日期（传入放款日期、第N期）
3. 按月计息-每月固定日期还款-计算还款日期（传入放款日期、第N期）
4. str类型时间转化为时间戳格式；
5. 计算当前日期前N天、当前日期后N天

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

from datetime import datetime,timedelta,date
import time
import calendar

def stamp_to_date(timestamp):
    time_stamp = int(timestamp * (10 ** (10 - len(str(timestamp)))))  # 13位转10位
    dt_date = date.fromtimestamp(time_stamp)
    return dt_date

# 传入datetime类型得到time类型，再得到时间戳格式（int）
def datetime_to_time(dt_time):
    dt_time = dt_time.timetuple()                # 转换为time格式
    dt_timestamp = int(time.mktime(dt_time))
    # print(dt_timestamp)
    return dt_timestamp


# 传入str类型得到时间戳格式（int）
def str_to_timestamp(dt_str):
    dt_time = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S")
    # print(type(dt_time),dt_time)
    time_stamp = datetime_to_time(dt_time)
    #print(time_stamp)
    return time_stamp


# 时间往后+N天  type-时间类型：s:2019-01-01; t:20190101，其他qt 20200312151512
def add_date(dt,n,type):
    #dt = datetime.now()
    delta_day = timedelta(days=n)
    if type == 't':
        new_date = (dt + delta_day).strftime('%Y-%m-%d')
    elif type == 's':
        new_date = (dt + delta_day).strftime('%Y%m%d')
    elif type == 'q':
        new_date = (dt + delta_day).strftime('%Y%m%d%H%M%S')
    else:
        new_date = (dt + delta_day).strftime('%Y-%m-%d %H:%M:%S')
    #print(new_date)
    return new_date


# 时间往前-N天,type-时间类型：t:2019-01-01; s:20190101，q:20200312151512，其他qt 2020-04-09 10:25:34
def minus_date(n,type):
    dt = datetime.now()
    delta_day = timedelta(days=n)
    if type == 't':
        new_date = (dt - delta_day).strftime('%Y-%m-%d')
    elif type == 's':
        new_date = (dt - delta_day).strftime('%Y%m%d')
    elif type == 'q':
        new_date = (dt - delta_day).strftime('%Y%m%d%H%M%S')
    elif type == 'h':
        new_date = (dt - delta_day).strftime('%Y%m%d%H')
    else:
        new_date = (dt - delta_day).strftime('%Y-%m-%d %H:%M:%S')
    #print(new_date)
    return new_date


# dt_str与某个日期ym_str间隔天数int
def get_days(dt_str,ym_str):
    dt_date = datetime.strptime(dt_str, "%Y-%m-%d")
    ym_date = datetime.strptime(ym_str, "%Y-%m-%d")
    try:
        days = int(str(dt_date - ym_date).split(' day')[0])
    except:
        days = 0
    if  days >=0:
        int_day = days
    else:
        int_day = 0
    #print(int_day)
    return int_day


# 传入str类型计算到期还款日（按日计息,num-间隔天数）
def month_days(dt_str,num):
    dt_time = datetime.strptime(dt_str, "%Y-%m-%d")
    delta = timedelta(days=num)
    n_days = (dt_time + delta).strftime('%Y-%m-%d')
    #print(n_days)
    return n_days


# 按月还款：ym_str-字符串格式放款日期; num-第N期; n_date-得到字符串类型还款日期
# (假设1月31号放款， 2月只有28天，28号为还款日；假设3月31号放款,4月30号为还款日; 假设4月5日放款，5月5日为还款日)
def date_calculate(ym_str,num):
    ym_date = datetime.strptime(ym_str, "%Y-%m-%d")
    s_year = ym_date.year
    s_month = ym_date.month + num                     # 第N个月
    s_day = ym_date.day
    n_year = int((s_month-1)/12)                      # 对比12个月，计算年度
    c_year = s_year +n_year
    c_month = s_month-12*n_year
    c_day = calendar.monthrange(c_year, c_month)[1]   # 获取某月多少天：闰年（被4整除且不被100整除、或者被400整除）2月29天,否则28天
    #print(type(days),days)                           # 第一个元素：这个月的第一天是星期几(0-6)； 第二个元素：这个月的天数
    if c_day>=s_day:                                  # 如果当月天数小于借款日天数，取当月天数，否则取借款日天数
        n_day = s_day
    else:
        n_day = c_day
    n_date = date(c_year,c_month,n_day).strftime('%Y-%m-%d')
    #print(n_date)
    return(n_date)


# 得到所有期数的到期还款日集合：[[1, '2020-04-15'], [2, '2020-05-15'], [期数, '到期还款日']]
# 当月固定某天还款(借款日期，总期数，固定每月到期日)-->比如账单日：15日，上月15日到这个月14日的都算是这个月15日还
def cur_dates_fixed(ym_str,num,day):
    ym_date = datetime.strptime(ym_str, "%Y-%m-%d")
    list_days = []
    s_year = ym_date.year                              # 起始、年
    for i in range(num):
        row = []
        if int(ym_date.day) >= day:                   # 如果放款日天大于等于账单日，下个月第一次还款
            s_month = ym_date.month + i +1
        else:
            s_month = ym_date.month + i
        n_year = int((s_month-1)/12)                    # 对比12个月，如果跨年，进一
        c_year = s_year +n_year
        c_month = s_month-12*n_year
        n_date = date(c_year, c_month, day).strftime('%Y-%m-%d')
        row.append(i+1)
        row.append(n_date)
        list_days.append(row)
    print(list_days)
    return (list_days)


# 得到第N期的到期还款日：2020-04-15
# 当月固定某天还款(借款日期，第N期数，固定每月到期日)-->比如账单日：15日，上月15日到这个月14日的都算是这个月15日还
def cur_date_fixed(ym_str,num,day):
    ym_date = datetime.strptime(ym_str, "%Y-%m-%d")
    s_year = ym_date.year                              # 起始、年
    if int(ym_date.day) >= day:                   # 如果放款日天大于等于账单日，下个月第一次还款
        s_month = ym_date.month + num
    else:
        s_month = ym_date.month + num - 1
    n_year = int((s_month-1)/12)                    # 对比12个月，如果跨年，进一
    c_year = s_year +n_year
    c_month = s_month-12*n_year
    n_date = date(c_year, c_month, day).strftime('%Y-%m-%d')
    print(n_date)
    return (n_date)


# 得到所有期数的到期还款日集合：[[1, '2020-04-15'], [2, '2020-05-15'], [期数, '到期还款日']]
# 下月固定某天还款(借款日期，总期数，固定每月到期日)-->比如账单日：15日，上月1日到上月底的都算是这个月15日还
def next_dates_fixed(ym_str,num,day):
    ym_date = datetime.strptime(ym_str, "%Y-%m-%d")
    list_days = []
    s_year = ym_date.year                              # 起始、年
    for i in range(num):
        row = []
        s_month = ym_date.month + i +1
        n_year = int((s_month-1)/12)                    # 对比12个月，如果跨年，进一
        c_year = s_year +n_year
        c_month = s_month-12*n_year
        n_date = date(c_year, c_month, day).strftime('%Y-%m-%d')
        row.append(i+1)
        row.append(n_date)
        list_days.append(row)
    print(list_days)
    return (list_days)


# 得到第N期的到期还款日：2020-04-15
# 下月固定某天还款(借款日期，第N，固定每月到期日)-->比如账单日：15日，上月1日到上月底的都算是这个月15日还
def next_date_fixed(ym_str,num,day):
    ym_date = datetime.strptime(ym_str, "%Y-%m-%d")
    s_year = ym_date.year                              # 起始、年
    s_month = ym_date.month + num
    n_year = int((s_month-1)/12)                    # 对比12个月，如果跨年，进一
    c_year = s_year +n_year
    c_month = s_month-12*n_year
    n_date = date(c_year, c_month, day).strftime('%Y-%m-%d')
    #print(n_date)
    return (n_date)


if __name__ == '__main__':
    ym_str = '2021-05-12'
    #month_days(ym_str,30)
    #cur_dates_fixed(ym_str, 3, 15)   # T月15日
    #next_date_fixed(ym_str, 3, 15)   # T+1月15日
    #get_days(ym_str)
    #date_calculate(ym_str,1)
    #dt_time = datetime.now()                              # 当前时间
    #datetime_to_time(dt_time)
    #dt_str = '2020-01-17 15:25:34'
    #str_to_timestamp(dt_str)
    get_days('2020-05-14',ym_str)



